"""
寻找链表循环的起点
挑战介绍
对于有循环的链表，实现一个算法来寻找链表循环的起点。要求如下：

例如链表以第 2，3，4 个结点为循环，即结点链接顺序为 head -> 1 -> 2 -> 3 -> 4 -> 2 -> 3 -> 4 -> ··· ，需要返回第 2 个结点。
挑战内容
本次挑战中，你需要在 loop_start.py 文件中补充函数 find_loop_start 的空缺部分。

MyLinkedList 类继承“实现链表类”挑战中的 LinkedList 类。
MyLinkedList 类的 find_loop_start 方法用于寻找链表循环的起点，它没有输入值，需要返回一个结点。
如果链表没有结点，则返回 None；如果链表中没有循环，也返回 None。
"""
from linked_list import LinkedList


class MyLinkedList(LinkedList):

    def find_loop_start(self):
        if self.head is None or self.head.next is None:
            return None
        slow = self.head
        fast = self.head
        while fast.next is not None:
            slow = slow.next
            fast = fast.next.next
            if fast is None:
                return None
            if slow == fast:
                break
        slow = self.head
        while slow != fast:
            slow = slow.next
            fast = fast.next
            if fast is None:
                return None
        return slow
